import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 订单 (Order) 类。
 * UML 关系: 
 * 1. 组合: Order (1) *--> (1..*) OrderDetail
 * 2. 关联: Order (1) <--> (1) Payment
 */
public class Order {
    private Date createDate;
    private OrderStatus status;
    
    // 组合实现：包含 1 到多个订单详情
    private List<OrderDetail> details; 
    // 关联实现：关联到唯一的支付方式
    private Payment payment; 

    public Order(Payment payment) {
        this.createDate = new Date(); // 当前时间
        this.status = OrderStatus.CREATE;
        this.payment = payment;
        this.details = new ArrayList<>();
    }

    // 组合关系方法：添加订单详情
    public void addDetail(OrderDetail detail) {
        // 强制实现 OrderDetail 1..* 约束 (在创建订单后至少添加一个)
        this.details.add(detail); 
    }
    
    public double getTotalAmount() {
        // 汇总所有 OrderDetail 的小计
        return details.stream().mapToDouble(OrderDetail::calculateSubTotal).sum();
    }
    
    // 订单处理流程
    public boolean checkout() {
        // 1. 检查订单详情数量 (1..* 约束)
        if (this.details.isEmpty()) {
            System.out.println("错误: 订单必须包含至少一个订单详情项。");
            return false;
        }
        
        // 2. 更新 Payment 的金额，然后处理支付
        double total = getTotalAmount();
        // 在实际系统中，Payment 对象会在创建时设置金额，这里为简化逻辑赋值
        // payment.setAmount(total); 
        
        if (payment.processPayment()) {
            this.status = OrderStatus.PAID;
            System.out.println("订单总额: $" + total);
            System.out.println("订单状态更新为: PAID");
            return true;
        }
        return false;
    }


    // --- 主测试方法 ---
    public static void main(String[] args) {
        // 1. 创建独立存在的 Product
        Product laptop = new Product("Laptop Pro", 2.0, "High-end laptop", 1500.00);
        Product mouse = new Product("Wireless Mouse", 0.1, "Simple mouse", 25.00);

        // 2. 创建 Customer
        Customer customerA = new Customer("Chen Zi Xuan", "138xxxxxxxx", "123 Main St");
        
        // 3. 创建 Payment 实例 (使用继承自 Payment 的子类)
        Payment myPayment = new Credit(1550.00, "1234-5678", "VISA", new Date()); 
        
        // 4. 创建 Order 实例
        Order order1 = new Order(myPayment);

        // 5. 添加 OrderDetail (实现 Order *-- 1..* OrderDetail 组合)
        order1.addDetail(new OrderDetail(laptop, 1));
        order1.addDetail(new OrderDetail(mouse, 2));

        // 6. 关联 Order 到 Customer (实现 Customer -- 0..* Order 关联)
        customerA.addOrder(order1);
        
        System.out.println("客户: " + customerA.getName() + " 正在结账...");

        // 7. 结账并处理支付
        if (order1.checkout()) {
            // ... 后续可以进行 SHIPPING, DELIVERED 等状态更新
        }
    }
}